/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package es.fpsampayo.fin2006.importacionficheros;

import es.fpsampayo.fin2006.ImportarFichero;
import es.fpsampayo.recursos.Conexion;
import es.fpsampayo.recursos.OperacionesDB;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author fran
 */
public class ImportarFicheroCat implements Runnable {
    
    private String concello;
    private int anio;
    private File file;
    private boolean salir = false;
    private int id_parcela = 0;

    
    public void setAnio(int anio) {
        this.anio = anio;
    }

    public void setConcello(String concello) {
        this.concello = concello;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public void setSalir(boolean salir) {
        this.salir = salir;
    }

    public ImportarFicheroCat(String concello, int anio, File file) {
        this.concello = concello;
        this.anio = anio;
        this.file = file;
    }
    
    private void importarCat(File file) {

        FileReader fr = null;
        BufferedReader br = null;

        try {
            
            int regActual = 0;
            int regIns11 = 0;
            int regIns13 = 0;
            int regIns14 = 0;
            int totalReg = contarRegistros(file);
            System.out.println("total registros: " + totalReg);
            fr = new FileReader(file);
            br = new BufferedReader(fr);
            Conexion conexion = new Conexion();
            id_parcela = OperacionesDB.devolverIdMax();
            //int inicio = 0;
            String sI;
            char caracter[] = new char[1000];
            br.mark(1000);
            //while (br.read(new char[1000], inicio, 1000) != -1){
            int count = 0;

            while (br.read(caracter) != -1) {
                System.out.println("caracter 1 : " + caracter[0] + caracter[1]);

                if (salir == true){
                    break;
                }

                sI = String.valueOf(caracter);
                if (sI.contains("'")) {
                    sI = sI.replace("'", "´");
                }
                if (sI.substring(0, 2).equals("11")) {
                    //System.out.println("SQL11: '" + parsearRegistro11(sI));
                    //conexion.insertar(parsearRegistro11(sI));
                    id_parcela++;
                    conexion.insertarPorLotes(parsearRegistro11(sI));
                    
                    regIns11 = regIns11 + 1;
                } else if (sI.substring(0, 2).equals("13")) {
                    //System.out.println("SQL13: '" + parsearRegistro13(sI));
                    //conexion.insertar(parsearRegistro13(sI));
                    conexion.insertarPorLotes(parsearRegistro13(sI));
                    regIns13 = regIns13 + 1;
                } else if (sI.substring(0, 2).equals("14")) {
                    //System.out.println("SQL14: '" + parsearRegistro14(sI));
                    //conexion.insertar(parsearRegistro14(sI));
                    conexion.insertarPorLotes(parsearRegistro14(sI));
                    regIns14 = regIns14 + 1;
                }
                count++;
                
                if (count == 200){
                    conexion.ejecutarLote();
                    conexion.limpiarLote();
                    count = 0;
                }
                
                //inicio = inicio + 1000;
                //System.out.print("Registro Array:" + regActual + ": " + sI + "\n");
                regActual = regActual + 1;
                ImportarFichero.setTextoProgeso(regActual, totalReg);
                int progreso = (regActual * 100) / totalReg;
                ImportarFichero.setBarProgresoValue(progreso); 
            }
            conexion.ejecutarLote();
            //OperacionesDB.relacionarTablas(concello);
            if (salir == false){
                JOptionPane.showMessageDialog(null, "Se han insertado " + regIns11 + " registros correctamente.");
                JOptionPane.showMessageDialog(null, "Se ha terminado la operación correctamente.");
            }
            conexion.Desconectar();

        } catch (IOException ex) {
            Logger.getLogger(ImportarFicheroPad.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    
    private int contarRegistros(File file) throws IOException {
        FileReader fr = null;
//        InputStreamReader isr;
//        FileInputStream fi = new FileInputStream(file);
//        isr = new InputStreamReader(fi,"UTF-8");
        BufferedReader br = null;
        int i = 0;

        try {
            fr = new FileReader(file);
            br = new BufferedReader(fr);
            while (br.readLine() != null) {
                i = i + 1;
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ImportarFichero.class.getName()).log(Level.SEVERE, null, ex);
        }
        return i;
    }
    
    private String parsearRegistro11 (String s){
        String sql = null;
        
        int cod_delegacion = Integer.parseInt(s.substring(23, 25));
        int cod_municipio_DGC = Integer.parseInt(s.substring(25, 28).trim());
        String clase_BI = s.substring(28, 30).trim();
        String referencia_catastral = s.substring(30, 44).trim();
        int cod_prov = Integer.parseInt(s.substring(50, 52));
        String nombre_prov = s.substring(52, 77).trim();
        int cod_municipio_DG = Integer.parseInt(s.substring(77, 80));
        int cod_municipio_INE = Integer.parseInt(s.substring(80, 83));
        String nombre_mun = s.substring(83, 123).trim();
        String nombre_EM = s.substring(123, 153).trim();
        int cod_via = Integer.parseInt(s.substring(153, 158));
        String sg_via = s.substring(158, 163).trim();
        String nombre_via = s.substring(163, 188).trim();
        String num_pol1 = s.substring(188, 192);
            if (num_pol1.equals("0000")) {
                num_pol1 = "0";
            } else {
                num_pol1 = num_pol1.replace("0", "");
            }
        String dup1 = s.substring(192, 193).trim();
        String num_pol2 = s.substring(193, 197);
            if (num_pol2.equals("0000")) {
                num_pol2 = "0";
            } else {
                num_pol2 = num_pol2.replace("0", "");
            }
        String dup2 = s.substring(197, 198).trim();
        String km = s.substring(198, 203).trim();
        String bloque = s.substring(203, 207).trim();
        String dir_no_estructurada = s.substring(215, 240).trim();
        String cod_postal = s.substring(240, 245).trim();
        String distrito = s.substring(245, 247).trim();
        String cod_mun_origen = s.substring(247, 250).trim();
        String zona_concentracion = s.substring(250, 252).trim();
        String poligono = s.substring(252, 255).trim();
        String parcela = s.substring(255, 260).trim();
        String cod_paraje = s.substring(260, 265).trim();
        String paraje = s.substring(265, 295).trim();
        int sup_finca = Integer.parseInt(s.substring(295, 305));
        int sup_cons_total = Integer.parseInt(s.substring(305, 312));
        int sup_cons_sobre_rasante = Integer.parseInt(s.substring(312, 319));
        int sup_cons_bajo_rasante = Integer.parseInt(s.substring(319, 326));
        int sup_cubierta = Integer.parseInt(s.substring(326, 333));
        String coor_x = s.substring(333, 342).trim();
        String coor_y = s.substring(342, 352).trim();
        String referencia_catastral_bice = s.substring(581, 601).trim();
        String denominacion_bice = s.substring(601, 666).trim();
        String huso_geografico_srs = s.substring(666, 676).trim();
        
        
        
        sql = "INSERT INTO cat.finca("
                + "id_parcela, "
                + "cod_delegacion, "
                + "cod_municipio_dgc, "
                + "clase_bi, "
                + "referencia_catastral, "
                + "cod_prov, "
                + "nombre_prov, "
                + "cod_municipio_dg, "
                + "cod_municipio_ine, "
                + "nombre_municipio, "
                + "nombre_em, "
                + "cod_via, "
                + "sg_via, "
                + "nombre_via, "
                + "num_pol1, "
                + "dup1, "
                + "num_pol2, "
                + "dup2, "
                + "km, "
                + "bloque, "
                + "dir_no_estructurada, "
                + "cod_postal, "
                + "distrito, "
                + "cod_mun_origen, "
                + "zona_concentracion, "
                + "poligono, "
                + "parcela, "
                + "cod_paraje, "
                + "paraje, "
                + "sup_finca, "
                + "sup_cons_total, "
                + "sup_cons_sobre_rasante, "
                + "sup_cons_bajo_rasante, "
                + "sup_cubierta, "
                + "coor_x, "
                + "coor_y, "
                + "referencia_catastral_bice, "
                + "denominacion_bice, "
                + "huso_geografico_srs, "
                + "concello, "
                + "anio)" +
                "VALUES (" 
                + id_parcela + ","
                + cod_delegacion + ","
                + cod_municipio_DGC + ",\'"
                + clase_BI + "\',\'"
                + referencia_catastral + "\',"
                + cod_prov + ",\'"
                + nombre_prov + "\',"
                + cod_municipio_DG + ","
                + cod_municipio_INE + ",\'"
                + nombre_mun + "\',\'"
                + nombre_EM + "\',"
                + cod_via + ",\'"
                + sg_via + "\',\'"
                + nombre_via + "\',\'"
                + num_pol1 + "\',\'"
                + dup1 + "\',\'"
                + num_pol2 + "\',\'"
                + dup2 + "\',\'"
                + km + "\',\'"
                + bloque + "\',\'"
                + dir_no_estructurada + "\',\'"
                + cod_postal + "\',\'"
                + distrito + "\',\'"
                + cod_mun_origen + "\',\'"
                + zona_concentracion + "\',\'"
                + poligono + "\',\'"
                + parcela + "\',\'"
                + cod_paraje + "\',\'"
                + paraje + "\',"
                + sup_finca + ","
                + sup_cons_total + ","
                + sup_cons_sobre_rasante + ","
                + sup_cons_bajo_rasante + ","
                + sup_cubierta + ",\'"
                + coor_x + "\',\'"
                + coor_y + "\',\'"
                + referencia_catastral_bice + "\',\'"
                + denominacion_bice + "\',\'"
                + huso_geografico_srs + "\',\'"
                + concello + "\',\'" 
                + anio + "\')";
        
        return sql;
    }
    
    private String parsearRegistro13 (String s){
        String sql = null;
        
        int cod_delegacion = Integer.parseInt(s.substring(23, 25));
        int cod_municipio_dgc = Integer.parseInt(s.substring(25, 28));
        String clase_uc = s.substring(28, 30).trim();
        String referencia_catastral = s.substring(30, 44).trim();
        String cod_unidad_cons = s.substring(44, 48).trim();
        int cod_prov = Integer.parseInt(s.substring(50, 52));
        String nombre_prov = s.substring(52, 77).trim();
        int cod_municipio_dg = Integer.parseInt(s.substring(77, 80));
        int cod_municipio_ine = Integer.parseInt(s.substring(80, 83));
        String nombre_municipio = s.substring(83, 123).trim();
        String nombre_em = s.substring(123, 153).trim();
        int cod_via = Integer.parseInt(s.substring(153, 158));
        String sg_via = s.substring(158, 163).trim();
        String nombre_via = s.substring(163, 188).trim();
        String num_pol1 = s.substring(188, 192).trim();
        if (num_pol1.equals("0000")) {
                num_pol1 = "0";
            } else {
                num_pol1 = num_pol1.replace("0", "");
            }
        String dup1 = s.substring(192, 193).trim();
        String num_pol2 = s.substring(193, 197).trim();
        if (num_pol2.equals("0000")) {
                num_pol2 = "0";
            } else {
                num_pol2 = num_pol2.replace("0", "");
            }
        String dup2 = s.substring(197, 198).trim();
        String km = s.substring(198, 204).trim();
        String dir_no_estructurada = s.substring(215, 240).trim();
        int anio_cons = Integer.parseInt(s.substring(295, 299));
        String ind_exac = s.substring(299, 300).trim();
        int sup_unidad_cons = Integer.parseInt(s.substring(300, 307));
        int long_fachada = Integer.parseInt(s.substring(307, 312));
        String u_cons_matriz = s.substring(409, 413).trim();
        
        /*Conexion conexion = new Conexion();
        ResultSet rs = conexion.Select("SELECT id_parcela FROM cat.finca WHERE referencia_catastral = \'" + referencia_catastral + "\'");
        try {
            while (rs.next()) {
                id_parcela = Integer.parseInt(rs.getObject("id_parcela").toString());
                System.out.println("id_parcela: " + id_parcela);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ImportarFicheroPad.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            conexion.Desconectar();
        }*/
          
          sql = "INSERT INTO cat.unidad_construcctiva("
                  + "id_parcela, "
                  + "cod_delegacion, "
                  + "cod_municipio_dgc, "
                  + "clase_uc, "
                  + "referencia_catastral, "
                  + "cod_unidad_cons, "
                  + "cod_prov, "
                  + "nombre_prov, "
                  + "cod_municipio_dg, "
                  + "cod_municipio_ine, "
                  + "nombre_municipio, "
                  + "nombre_em, "
                  + "cod_via, "
                  + "sg_via, "
                  + "nombre_via, "
                  + "num_pol1, "
                  + "dup1, "
                  + "num_pol2, "
                  + "dup2, "
                  + "km, "
                  + "dir_no_estructurada, "
                  + "anio_cons, "
                  + "ind_exac, "
                  + "sup_unidad_cons, "
                  + "long_fachada, "
                  + "u_cons_matriz, "
                  + "concello, "
                  + "anio) "
                  + "VALUES ("
                  + id_parcela + ","
                  + cod_delegacion + ","
                  + cod_municipio_dgc + ",\'"
                  + clase_uc + "\',\'"
                  + referencia_catastral + "\',\'"
                  + cod_unidad_cons + "\',"
                  + cod_prov + ",\'"
                  + nombre_prov + "\',"
                  + cod_municipio_dg + ","
                  + cod_municipio_ine + ",\'"
                  + nombre_municipio + "\',\'"
                  + nombre_em + "\',"
                  + cod_via + ",\'"
                  + sg_via + "\',\'"
                  + nombre_via + "\',\'"
                  + num_pol1 + "\',\'"
                  + dup1 + "\',\'"
                  + num_pol2 + "\',\'"
                  + dup2 + "\',\'"
                  + km + "\',\'"
                  + dir_no_estructurada + "\',"
                  + anio_cons + ",\'"
                  + ind_exac + "\',"
                  + sup_unidad_cons + ","
                  + long_fachada + ",\'"
                  + u_cons_matriz + "\',\'"
                  + concello + "\',"
                  + anio + ");";
        
        return sql;
    }

    private String parsearRegistro14 (String s){
        String sql = null;
        
        int cod_delegacion = Integer.parseInt(s.substring(23, 25));
        int cod_municipio_dgc = Integer.parseInt(s.substring(25, 28));
        String referencia_catastral = s.substring(30, 44).trim();
        int cod_cons = Integer.parseInt(s.substring(44, 48));
        String cod_bien_inmueble = s.substring(50, 54).trim();
        String cod_unidad_cons = s.substring(54, 58).trim();
        String bloque = s.substring(58, 62).trim();
        String escalera = s.substring(62, 64).trim();
        String planta = s.substring(64, 67).trim();
        String puerta = s.substring(67, 70).trim();
        String destino = s.substring(70, 73).trim();
        String tipo_reforma = s.substring(73, 74).trim();
        int anio_reforma = Integer.parseInt(s.substring(74, 78));
        int anio_anti = Integer.parseInt(s.substring(78, 82));
        String ind_local_interior = s.substring(82, 83).trim();
        int sup_total = Integer.parseInt(s.substring(83, 90));
        int sup_por_tza = Integer.parseInt(s.substring(90, 97));
        int sup_otras = Integer.parseInt(s.substring(97, 104));
        String tipologia = s.substring(104, 109).trim();
        String mod_reparto = s.substring(111, 114).trim();
        
        /*Conexion conexion = new Conexion();
        ResultSet rs = conexion.Select("SELECT id_parcela FROM cat.finca WHERE referencia_catastral = \'" + referencia_catastral + "\'");
        try {
            while (rs.next()) {
                id_parcela = Integer.parseInt(rs.getObject("id_parcela").toString());
                System.out.println("id_parcela: " + id_parcela);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ImportarFicheroPad.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            conexion.Desconectar();
        }*/
        
        sql = "INSERT INTO cat.construccion("
                + "id_parcela, "
                + "cod_delegacion, "
                + "cod_municipio_dgc, "
                + "referencia_catastral, "
                + "cod_cons, "
                + "cod_bien_inmueble, "
                + "cod_unidad_cons, "
                + "bloque, "
                + "escalera, "
                + "planta, "
                + "puerta, "
                + "destino, "
                + "tipo_reforma, "
                + "anio_reforma, "
                + "anio_anti, "
                + "ind_local_interior, "
                + "sup_total, "
                + "sup_por_tza, "
                + "sup_otras, "
                + "tipologia, "
                + "mod_reparto, "
                + "concello, "
                + "anio) "
                + "VALUES ("
                + id_parcela + ","
                + cod_delegacion + ","
                + cod_municipio_dgc + ",\'"
                + referencia_catastral + "\',"
                + cod_cons + ",\'"
                + cod_bien_inmueble + "\',\'"
                + cod_unidad_cons + "\',\'"
                + bloque + "\',\'"
                + escalera + "\',\'"
                + planta + "\',\'"
                + puerta + "\',\'"
                + destino + "\',\'"
                + tipo_reforma + "\',"
                + anio_reforma + ","
                + anio_anti + ",\'"
                + ind_local_interior + "\',"
                + sup_total + ","
                + sup_por_tza + ","
                + sup_otras + ",\'"
                + tipologia + "\',\'"
                + mod_reparto + "\',\'"
                + concello + "\',"
                + anio + ");";

                
        return sql;
    }
    
    private String importarRegistro15 (String s){
        String sql = null;
        
        
        return sql;
    }
    
    private String importarRegistro16 (String s){
        String sql = null;
        
        
        return sql;
    }
    
    private String importarRegistro17 (String s){
        String sql = null;
        
        
        return sql;
    }

    @Override
    public void run() {
        
            importarCat(file);
    }
}
